Load code

Load data

single lemma

metrics for all lemmas

Filter data

Uses in first subset

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'one'
    ) %>%
  select(LEMMA, USES_TOT, USES) %>%
  arrange(USES)

Case studies

Check tweets

tweets %>%
  select(tweet, date) %>%
  # slice(., sample(1:n())) #random selection
  arrange(date)

Usage frequency

Overall across cases

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
   arrange(desc(USES_TOT))

Single lemma

uses <- get_uses(tweets)
uses_tot <- get_uses_tot(uses)
age = get_age(uses)
coef_var <- get_coef_var(uses)
mean_date <- get_mean_date(uses)
max_date <- get_max_date(uses)
uses_month <- conv_uses_month(uses)
uses_plt <- plt_uses(uses_month, lemma, mean_date, max_date)
ggplotly(uses_plt)

Degree centralization

Diachronic

plt <- df_comp %>%
  select(LEMMA, SUBSETTING, SUBSET, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET != 'full',
    LEMMA %in% cases
  ) %>%
  ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
    geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
    geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
    guides(group=FALSE) +
    ggtitle('Diffusion over time: changes in degree centralization') +
    scale_y_continuous('degree centrality') +
    scale_x_discrete('subset')

plt


# ggsave('out/cent_deg_diac_Anglo-Saxon.pdf', width=6, height=4)

Overall

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
  select(
    LEMMA, 
    EDGES,
    CENT_DEGREE, 
    CENT_EV
    ) %>%
  arrange((CENT_DEGREE))

Comparative analyses

Degree centrality

Overall

List

df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET == 'full',
    USES >= 2
    ) %>%
  arrange(
    # (CENT_DEGREE)
    desc(CENT_EV)
  )

Plot

plt <- df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
  filter(SUBSET == 'full') %>%
  arrange((CENT_DEGREE)) %>%
  ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
    geom_point() +
    scale_y_discrete('lemmas') +
    scale_x_continuous(
      'degree centralization (log)',
      trans='log'
      )

plt

# ggsave('out/cent_sync_all.pdf', width=6, height=4)

Over time

Across all lemmas

df_comp %>%
  filter(
    SUBSET %in% c('one', 'two', 'three', 'four'),
    # USES >= 1000,
    USES_TOT >= 10000
    ) %>%
  group_by(SUBSET) %>%
  summarize(CENT_AVG = mean(CENT_DEGREE)) %>%
  ggplot(., aes(x=SUBSET, y=CENT_AVG, group=1)) +
    geom_line() +
    geom_point()

Biggest changes

Usage intensity

df_comp %>%
  filter(SUBSET == 'full') %>%
  arrange(desc(USES))

Usage intensity vs. network characteristics

Uses vs. degree centralization

Plot

plt <- df_comp %>%
  filter(
    SUBSET == 'full'
    # USES %in% (10000:2000000),
    # USES %in% (150000:500000),
    # !LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
    ) %>%
  select(LEMMA, CENT_DEGREE, USES, EDGES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=USES)) +
    geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) + 
    geom_point() +
    scale_y_continuous(
      'usage frequency (log)', 
      trans='log'
      ) +
    scale_x_continuous(
      'degree centralization',
      # trans='log'
      ) +
    ggtitle(
      # 'Usage frequency vs. degree centralization: full sample'
      'Usage frequency vs. degree centralization: zooming on case study lexemes'
      )
    # geom_smooth(method=lm)

ggplotly(plt)

# ggsave('~/Desktop/freq-vs-net.pdf', width=6, height=4)
    

Biggest discrepancies

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'full'
    ) %>%
  select(LEMMA, USES_TOT, SUBSET, USES, CENT_DEGREE) %>%
  mutate(DISC = USES_TOT / CENT_DEGREE) %>%
  arrange(DISC)

Correlation

df_corr <- df_comp %>%
  filter(
    # SUBSET != 'full'
    # EDGES >= 100
    ) %>%
  select(-c(LEMMA, SUBSET, START, END, SKIP, STAMP))
  
cor.test(df_corr$USES, df_corr$CENT_DEGREE)

    Pearson's product-moment correlation

data:  df_corr$USES and df_corr$CENT_DEGREE
t = -2.5216, df = 544, p-value = 0.01197
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.18968708 -0.02378785
sample estimates:
       cor 
-0.1074856 

Degree centrality vs. communities

Correlation

df_comp %>%
  filter(SUBSET == 'last') %>%
  select(CENT_DEGREE, COMMUNITIES) %>%
  mutate(COMMUNITIES = as.numeric(COMMUNITIES)) %>%
  correlate()

Plot

df_comp %>%
  filter(SUBSET == 'last') %>%
  select(LEMMA, CENT_DEGREE, COMMUNITIES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=as.numeric(COMMUNITIES))) +
    geom_text(aes(label=LEMMA)) +
    scale_x_continuous(trans='log')

Uses vs. users

Plot

plt <- df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, USES_TOT, USERS_TOT) %>%
  ggplot(., aes(x=USERS_TOT, y=USES_TOT)) +
    geom_text(aes(label=LEMMA)) +
    scale_x_continuous(trans='log') +
    scale_y_continuous(trans='log') +
    geom_smooth(method=lm)
ggplotly(plt)

Correlation

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(USES_TOT, USERS_TOT) %>%
  correlate()

Correlation method: 'pearson'
Missing treated using: 'pairwise.complete.obs'

Coefficient of variation

df_comp %>%
  filter(
    SUBSET == 'full',
    USES_TOT >= 1000
    ) %>%
  select(LEMMA, USES_TOT, COEF_VAR) %>%
  arrange(desc(COEF_VAR))

Processing status

Lemma list

df_comp %>%
  select(LEMMA, SUBSET, STAMP) %>%
  filter(SUBSET == 'four') %>%
  # mutate(STAMP = as_datetime(STAMP)) %>%
  arrange(desc(STAMP))

Dataset statistics

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, SUBSET, USES_TOT, USERS_TOT) %>%
  dplyr::summarise(
    USES_ALL = sum(USES_TOT),
    USERS_ALL = sum(USERS_TOT)
    )

COEF_VAR vs. CENT

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, COEF_VAR, CENT_DEGREE) %>%
  ggplot(., aes(y=COEF_VAR, x=CENT_DEGREE)) +
    geom_text(aes(label=LEMMA))

    # scale_y_continuous(trans='log')

Correlations: EDA

library(Hmisc)

df_corr <- df_comp %>%
  # filter(SUBSET == 'last') %>%
  select(-c(LEMMA, SUBSETTING, SUBSET, START, END, SKIP, STAMP)) %>%
  select(-c(USERS_TOT, AGE)) %>%
  mutate(FOCUS = USES_TOT) %>%
  focus(FOCUS) %>%
  ggplot(., aes(reorder(rowname, FOCUS), FOCUS)) +
  geom_col() +
  coord_flip()
Fehler in UseMethod("focus_") : 
  nicht anwendbare Methode für 'focus_' auf Objekt der Klasse "c('tbl_df', 'tbl', 'data.frame')" angewendet
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBMb2FkIGNvZGUKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNvdXJjZSgnc3JjL2xvYWQtZGF0YS5SJykKc291cmNlKCdzcmMvcG9zdHByb2MuUicpCnNvdXJjZSgnc3JjL3VzZXMuUicpCnNvdXJjZSgnc3JjL3VzZXJzLlInKQpzb3VyY2UoJ3NyYy9zbmEuUicpCgpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCgojIExvYWQgZGF0YQoKIyMgc2luZ2xlIGxlbW1hCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpjb3JwdXMgPC0gJy9Wb2x1bWVzL3FqZC90d2ludC8nCmxlbW1hIDwtICdBbmdsby1TYXhvbicKCnR3ZWV0cyA8LSBsb2FkX2RhdGEoY29ycHVzLCBsZW1tYSkKdHdlZXRzIDwtIHBvc3Rwcm9jKHR3ZWV0cykKYGBgCgojIyBtZXRyaWNzIGZvciBhbGwgbGVtbWFzCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQppZiAoZXhpc3RzKCdkZl9jb21wJykgPT0gRkFMU0UpIHsKICBkZl9jb21wIDwtIHJlYWRfZGZfY29tcCgpCn0KYGBgCgoKIyBGaWx0ZXIgZGF0YQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KZGZfY29tcCAlPD4lIAogIGZpbHRlcigKICAgIFNLSVAgIT0gVFJVRSwKICAgIFNVQlNFVFRJTkcgPT0gJ3RpbWUnCiAgICAjIHN1Y2Nlc3NmdWwgd29yZHM6IFVTRVNfVE9UID49IDEwMDAwCiAgICAjIHVuc3VjY2Vzc2Z1bCB3b3JkczogVVNFU19UT1QgPD0gMTAwMDAKICAgICMgd2VpcmQgd29yZHM6IGJpZyBkaWNrIGVuZXJneQogICAgIyBlc3RhYmxpc2hlZCB3b3JkcyBmcm9tIGxpc3QKICAgICkKYGBgCgoKIyMgVXNlcyBpbiBmaXJzdCBzdWJzZXQKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVFRJTkcgPT0gJ3RpbWUnLAogICAgU1VCU0VUID09ICdvbmUnCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIFVTRVMpICU+JQogIGFycmFuZ2UoVVNFUykKYGBgCgoKCiMgQ2FzZSBzdHVkaWVzCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpjYXNlcyA8LSBjKAogICdnaG9zdGluZycsIAogICdsaXR1YXRpb24nLCAKICAnYWx0LWxlZnQnLCAKICAnc29sb3ByZW5ldXInLAogICd1cGN5Y2xpbmcnLAogICd1cHNraWxsJywKICAnYmFlY2F0aW9uJywKICAnZGFzaGNhbScsCiAgJ292ZXJ0b3VyaXNtJwogICkKYGBgCgoKIyMgQ2hlY2sgdHdlZXRzCgpgYGB7cn0KdHdlZXRzICU+JQogIHNlbGVjdCh0d2VldCwgZGF0ZSkgJT4lCiAgIyBzbGljZSguLCBzYW1wbGUoMTpuKCkpKSAjcmFuZG9tIHNlbGVjdGlvbgogIGFycmFuZ2UoZGF0ZSkKYGBgCgoKIyMgVXNhZ2UgZnJlcXVlbmN5CgojIyMgT3ZlcmFsbCBhY3Jvc3MgY2FzZXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIExFTU1BICVpbiUgY2FzZXMsCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogICBhcnJhbmdlKGRlc2MoVVNFU19UT1QpKQpgYGAKCgoKIyMjIFNpbmdsZSBsZW1tYQoKYGBge3J9CnVzZXMgPC0gZ2V0X3VzZXModHdlZXRzKQp1c2VzX3RvdCA8LSBnZXRfdXNlc190b3QodXNlcykKYWdlID0gZ2V0X2FnZSh1c2VzKQpjb2VmX3ZhciA8LSBnZXRfY29lZl92YXIodXNlcykKbWVhbl9kYXRlIDwtIGdldF9tZWFuX2RhdGUodXNlcykKbWF4X2RhdGUgPC0gZ2V0X21heF9kYXRlKHVzZXMpCnVzZXNfbW9udGggPC0gY29udl91c2VzX21vbnRoKHVzZXMpCnVzZXNfcGx0IDwtIHBsdF91c2VzKHVzZXNfbW9udGgsIGxlbW1hLCBtZWFuX2RhdGUsIG1heF9kYXRlKQpnZ3Bsb3RseSh1c2VzX3BsdCkKYGBgCgoKIyMgRGVncmVlIGNlbnRyYWxpemF0aW9uCgojIyMgRGlhY2hyb25pYwoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VUVElORywgU1VCU0VULCBDRU5UX0RFR1JFRSwgQ0VOVF9FVikgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICE9ICdmdWxsJywKICAgIExFTU1BICVpbiUgY2FzZXMKICApICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9Q0VOVF9ERUdSRUUpKSArICMgZ3JvdXA9MQogICAgZ2VvbV9wb2ludChhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBzaGFwZT1MRU1NQSkpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBsaW5ldHlwZT1MRU1NQSkpICsKICAgIGd1aWRlcyhncm91cD1GQUxTRSkgKwogICAgZ2d0aXRsZSgnRGlmZnVzaW9uIG92ZXIgdGltZTogY2hhbmdlcyBpbiBkZWdyZWUgY2VudHJhbGl6YXRpb24nKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoJ2RlZ3JlZSBjZW50cmFsaXR5JykgKwogICAgc2NhbGVfeF9kaXNjcmV0ZSgnc3Vic2V0JykKCnBsdAoKIyBnZ3NhdmUoJ291dC9jZW50X2RlZ19kaWFjX0FuZ2xvLVNheG9uLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgT3ZlcmFsbAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgTEVNTUEgJWluJSBjYXNlcywKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICkgJT4lCiAgc2VsZWN0KAogICAgTEVNTUEsIAogICAgRURHRVMsCiAgICBDRU5UX0RFR1JFRSwgCiAgICBDRU5UX0VWCiAgICApICU+JQogIGFycmFuZ2UoKENFTlRfREVHUkVFKSkKYGBgCgoKIyBDb21wYXJhdGl2ZSBhbmFseXNlcwoKCiMjIERlZ3JlZSBjZW50cmFsaXR5CgoKIyMjIE92ZXJhbGwKCiMjIyMgTGlzdAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVMsIENFTlRfREVHUkVFLCBDRU5UX0VWKSAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgPT0gJ2Z1bGwnLAogICAgVVNFUyA+PSAyCiAgICApICU+JQogIGFycmFuZ2UoCiAgICAjIChDRU5UX0RFR1JFRSkKICAgIGRlc2MoQ0VOVF9FVikKICApCmBgYAoKCiMjIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIGFycmFuZ2UoKENFTlRfREVHUkVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PXJlb3JkZXIoTEVNTUEsIENFTlRfREVHUkVFKSkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2Rpc2NyZXRlKCdsZW1tYXMnKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgICdkZWdyZWUgY2VudHJhbGl6YXRpb24gKGxvZyknLAogICAgICB0cmFucz0nbG9nJwogICAgICApCgpwbHQKCiMgZ2dzYXZlKCdvdXQvY2VudF9zeW5jX2FsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIE92ZXIgdGltZQoKIyMjIyBBY3Jvc3MgYWxsIGxlbW1hcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJyksCiAgICBVU0VTX1RPVCA+PSAxMDAwMAogICAgKSAlPiUKICBncm91cF9ieShTVUJTRVQpICU+JQogIHN1bW1hcml6ZShDRU5UX0FWRyA9IG1lYW4oQ0VOVF9ERUdSRUUpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9U1VCU0VULCB5PUNFTlRfQVZHLCBncm91cD0xKSkgKwogICAgZ2VvbV9saW5lKCkgKwogICAgZ2VvbV9wb2ludCgpCmBgYAoKCiMjIyMgQmlnZ2VzdCBjaGFuZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIEVER0VTLCBVU0VTX1RPVCkgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygKICAgICAgJ29uZScsIAogICAgICAnZm91cicKICAgICAgKSwKICAgIFVTRVNfVE9UID49IDEwMDAwCiAgICApICU+JQogIGRwbHlyOjpncm91cF9ieShMRU1NQSkgJT4lCiAgZHBseXI6Om11dGF0ZShDRU5UX0RJRkYgPSBDRU5UX0RFR1JFRSAtIGxhZyhDRU5UX0RFR1JFRSwgZGVmYXVsdD1DRU5UX0RFR1JFRVsxXSkpICU+JQogIGRyb3BfbmEoKSAlPiUKICBzZWxlY3QoLVNVQlNFVCkgJT4lCiAgcmVuYW1lKAogICAgQ0VOVF9MQVNUID0gQ0VOVF9ERUdSRUUsCiAgICBFREdFU19MQVNUID0gRURHRVMKICAgICkgJT4lCiAgYXJyYW5nZSgoQ0VOVF9ESUZGKSkKYGBgCgoKIyBVc2FnZSBpbnRlbnNpdHkKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBhcnJhbmdlKGRlc2MoVVNFUykpCmBgYAoKCgojIFVzYWdlIGludGVuc2l0eSB2cy4gbmV0d29yayBjaGFyYWN0ZXJpc3RpY3MKCiMjIFVzZXMgdnMuIGRlZ3JlZSBjZW50cmFsaXphdGlvbgoKIyMjIFBsb3QKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICAjIFVTRVMgJWluJSAoMTAwMDA6MjAwMDAwMCksCiAgICAjIFVTRVMgJWluJSAoMTUwMDAwOjUwMDAwMCksCiAgICAjICFMRU1NQSAlaW4lIGMoJ3NsdXQgc2hhbWluZycsICdkYXNoY2FtJywgJ3NoYXJlYWJsZScsICdjdWNrb2xkJywgJ2RlZXAgbGVhcm5pbmcnLCAnaHlwZXJsb2NhbCcpCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgQ0VOVF9ERUdSRUUsIFVTRVMsIEVER0VTKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9Q0VOVF9ERUdSRUUsIHk9VVNFUykpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9TEVNTUEpLCBoanVzdD0tMC4xLCB2anVzdD0tMC4xKSArIAogICAgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cygKICAgICAgJ3VzYWdlIGZyZXF1ZW5jeSAobG9nKScsIAogICAgICB0cmFucz0nbG9nJwogICAgICApICsKICAgIHNjYWxlX3hfY29udGludW91cygKICAgICAgJ2RlZ3JlZSBjZW50cmFsaXphdGlvbicsCiAgICAgICMgdHJhbnM9J2xvZycKICAgICAgKSArCiAgICBnZ3RpdGxlKAogICAgICAjICdVc2FnZSBmcmVxdWVuY3kgdnMuIGRlZ3JlZSBjZW50cmFsaXphdGlvbjogZnVsbCBzYW1wbGUnCiAgICAgICdVc2FnZSBmcmVxdWVuY3kgdnMuIGRlZ3JlZSBjZW50cmFsaXphdGlvbjogem9vbWluZyBvbiBjYXNlIHN0dWR5IGxleGVtZXMnCiAgICAgICkKICAgICMgZ2VvbV9zbW9vdGgobWV0aG9kPWxtKQoKZ2dwbG90bHkocGx0KQojIGdnc2F2ZSgnfi9EZXNrdG9wL2ZyZXEtdnMtbmV0LnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQogICAgCmBgYAoKCiMjIyBCaWdnZXN0IGRpc2NyZXBhbmNpZXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVFRJTkcgPT0gJ3RpbWUnLAogICAgU1VCU0VUID09ICdmdWxsJwogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVNfVE9ULCBTVUJTRVQsIFVTRVMsIENFTlRfREVHUkVFKSAlPiUKICBtdXRhdGUoRElTQyA9IFVTRVNfVE9UIC8gQ0VOVF9ERUdSRUUpICU+JQogIGFycmFuZ2UoRElTQykKYGBgCgoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29yciA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgICMgU1VCU0VUICE9ICdmdWxsJwogICAgIyBFREdFUyA+PSAxMDAKICAgICkgJT4lCiAgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVQsIFNUQVJULCBFTkQsIFNLSVAsIFNUQU1QKSkKICAKY29yLnRlc3QoZGZfY29yciRVU0VTLCBkZl9jb3JyJENFTlRfREVHUkVFKQpgYGAKCgojIyBEZWdyZWUgY2VudHJhbGl0eSB2cy4gY29tbXVuaXRpZXMKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnbGFzdCcpICU+JQogIHNlbGVjdChDRU5UX0RFR1JFRSwgQ09NTVVOSVRJRVMpICU+JQogIG11dGF0ZShDT01NVU5JVElFUyA9IGFzLm51bWVyaWMoQ09NTVVOSVRJRVMpKSAlPiUKICBjb3JyZWxhdGUoKQpgYGAKCgojIyMgUGxvdAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnbGFzdCcpICU+JQogIHNlbGVjdChMRU1NQSwgQ0VOVF9ERUdSRUUsIENPTU1VTklUSUVTKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9Q0VOVF9ERUdSRUUsIHk9YXMubnVtZXJpYyhDT01NVU5JVElFUykpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSdsb2cnKQpgYGAKCgoKIyMgVXNlcyB2cy4gdXNlcnMKCiMjIyBQbG90CgpgYGB7cn0KcGx0IDwtIGRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIFVTRVJTX1RPVCkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVVTRVJTX1RPVCwgeT1VU0VTX1RPVCkpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9TEVNTUEpKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9J2xvZycpICsKICAgIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nJykgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtKQpnZ3Bsb3RseShwbHQpCmBgYAoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgc2VsZWN0KFVTRVNfVE9ULCBVU0VSU19UT1QpICU+JQogIGNvcnJlbGF0ZSgpCmBgYAoKCiMjIENvZWZmaWNpZW50IG9mIHZhcmlhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJywKICAgIFVTRVNfVE9UID49IDEwMDAKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgQ09FRl9WQVIpICU+JQogIGFycmFuZ2UoZGVzYyhDT0VGX1ZBUikpCmBgYAoKCiMjIFByb2Nlc3Npbmcgc3RhdHVzCgojIyMgTGVtbWEgbGlzdAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFNUQU1QKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmb3VyJykgJT4lCiAgIyBtdXRhdGUoU1RBTVAgPSBhc19kYXRldGltZShTVEFNUCkpICU+JQogIGFycmFuZ2UoZGVzYyhTVEFNUCkpCmBgYAoKCiMjIyBEYXRhc2V0IHN0YXRpc3RpY3MKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFU19UT1QsIFVTRVJTX1RPVCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIFVTRVNfQUxMID0gc3VtKFVTRVNfVE9UKSwKICAgIFVTRVJTX0FMTCA9IHN1bShVU0VSU19UT1QpCiAgICApCmBgYAoKCiMgQ09FRl9WQVIgdnMuIENFTlQKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIENPRUZfVkFSLCBDRU5UX0RFR1JFRSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh5PUNPRUZfVkFSLCB4PUNFTlRfREVHUkVFKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MRU1NQSkpCiAgICAjIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nJykKYGBgCgoKIyBDb3JyZWxhdGlvbnM6IEVEQQoKYGBge3J9CmxpYnJhcnkoSG1pc2MpCgpkZl9jb3JyIDwtIGRmX2NvbXAgJT4lCiAgIyBmaWx0ZXIoU1VCU0VUID09ICdsYXN0JykgJT4lCiAgIyBzZWxlY3QoLWMoTEVNTUEsIFNVQlNFVFRJTkcsIFNVQlNFVCwgU1RBUlQsIEVORCwgU0tJUCwgU1RBTVApKSAlPiUKICAjIHNlbGVjdCgtYyhVU0VSU19UT1QsIEFHRSkpICU+JQogICMgbXV0YXRlKEZPQ1VTID0gVVNFU19UT1QpICU+JQogICMgZm9jdXMoRk9DVVMpICU+JQogICMgZ2dwbG90KC4sIGFlcyhyZW9yZGVyKHJvd25hbWUsIEZPQ1VTKSwgRk9DVVMpKSArCiAgIyBnZW9tX2NvbCgpICsKICAjIGNvb3JkX2ZsaXAoKQogICMgcmVhcnJhbmdlKCkgJT4lCiAgIyBzaGF2ZSgpICU+JQogICMgcnBsb3QoKQogICMgbmV0d29ya19wbG90KG1pbl9jb3I9LjUpICU+JQoKICAKYGBgCgoKICA=